package com.briup.day19;

public class ThreadTest {
    public static void main(String[] args) throws Exception {
        // 获取当前执行任务的线程名字，main方法中固定有一个名为main的线程用于执行main方法中的任务
        System.out.println("当前执行任务的线程为:" + Thread.currentThread().getName() + "1");
        /*
            在java中要实现多线程，必须通过创建Thread类对象；
            Thread类是Java对于操作系统中线程的抽象和概括，
            通过创建Thread类对象能够操控操作系统中实际的物理线程；

            创建Thread类对象，即表示创建了一个线程，然后就可以给该线程
            分配任务，注意一个线程在同一时间段中只能处理一个任务，
            通常情况下，我们会在创建线程时就给其分配任务；
            在Java中任务使用 Runnable接口的run()方法表示
         */
        Thread t = new Thread(
                // 如果在创建对象时，在构造器中传入了Runnable接口的实现类对象，
                // 那么本线程在后续执行的任务就是该任务；
                // 如果没有传入那么本线程调用的就是Thread类中的run()方法，内部没有需要执行的任务
                new Runnable() {
                    // 向上抛出异常必须是在方法的定义中进行显示的声明；
                    // 如果原方法定义中没有声明向上抛出异常，那么在实现/重写方法时也不能声明异常
                    @Override
                    public void run() {
                        try {
                            send();
                        } catch (Exception e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
                , "发送消息的线程");
        // 开启多线程，执行线程任务，必须调用Thread类中的start()方法
        t.start();
//        receive();
        // 使用自定义的线程子类，创建线程
        MyThread myThread = new MyThread("接收消息的线程");
        myThread.start();
    }


    private static void send() throws Exception {
        System.out.println("用户在输入消息.........");
        System.out.println("等待输入中.........");
        Thread.sleep(10000);
        System.out.println("消息输入完毕.........");
        System.out.println("发送消息");
        System.out.println("当前执行任务的线程为:" + Thread.currentThread().getName() + "2");
    }


    public static void receive() {
        System.out.println("等待对方输入....");
        System.out.println("接收到消息");
        System.out.println("消息接收完毕");
        System.out.println("hello world");
        System.out.println("当前执行任务的线程为:" + Thread.currentThread().getName() + "3");
    }
}

class MyThread extends Thread {

    // 在创建线程时，可以通过name指定线程的名字，如果没有指定线程的名字，
    // 那么线程默认的名字为 Thread-theNextThreadNum num从0开始记，
    // 第一个创建的线程名字就为Thread-0
    public MyThread(String name) {
        super(name);
    }

    // 创建一个Thread类的子类，重写Thread类中的run()方法
    @Override
    public void run() {
        ThreadTest.receive();
    }
}
